package com.example.moments.utils;

import java.lang.ref.WeakReference;
import java.lang.reflect.Array;

/**
 * @author zhaojin
 * @date 2018/8/10
 */
//主要为了可以自动回收
public final class SimpleWeakObjectPool<T> {
    private WeakReference<T>[] objsPool;
//    https://www.cnblogs.com/zjj1996/p/9140385.html
//    但是, 也有特殊例外. 当使用cache的时候, 由于cache的对象正是程序运行需要的, 那么只要程序正在运行, cache中的引用就不会被GC给(或
//
//    下面进入正题，WeakReference如字面意思，弱引用， 当一个对象仅仅被weak reference（弱引用）指向,
//    而没有任何其他strong reference（强引用）指向的时候, 如果这时GC运行, 那么这个对象就会被回收，
//    不论当前的内存空间是否足够，这个对象都会被回收。
//
//    作者：BrightLoong
//    链接：https://www.jianshu.com/p/964fbc30151a
//    来源：简书
//    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
    private int size;
    private int curPointer = -1;


    public SimpleWeakObjectPool() {
        this(5);
    }

    public SimpleWeakObjectPool(int size) {
        this.size = size;
        objsPool = (WeakReference<T>[]) Array.newInstance(WeakReference.class, size);
    }

    public synchronized T get() {
        if (curPointer == -1 || curPointer > objsPool.length) return null;
        T obj = objsPool[curPointer].get();
        objsPool[curPointer] = null;
        curPointer--;
//        类似栈，取走的是最顶上的
        return obj;
    }

    public synchronized boolean put(T t) {
        if (curPointer == -1 || curPointer < objsPool.length - 1) {
            curPointer++;
            objsPool[curPointer] = new WeakReference<T>(t);
            return true;
        }
        return false;
    }

    public void clearPool() {
        for (int i = 0; i < objsPool.length; i++) {
            objsPool[i].clear();
            objsPool[i] = null;
        }
        curPointer = -1;
    }

    public int size() {
        return objsPool == null ? 0 : objsPool.length;
    }
}
